package com.jixiang.dictionary.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.jixiang.model.common.dtos.ResponseResult;
import com.jixiang.model.dictionary.entity.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

import static com.jixiang.common.constants.RedisConstants.*;

@RestController
@RequestMapping("dstool")
public class DsTool {



    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @ApiOperation("获取商品参数零时数据-dstoolGetDynamicParamAll")
    @GetMapping("/dstoolGetDynamicParamAll")
    public ResponseResult getMenuListByAdmin(String markId) {
        String SpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SPECS + markId);
        List<Specs> specsList = null;
        if (StrUtil.isNotBlank(SpecsJsonObj)) {
            specsList = JSONUtil.toList(SpecsJsonObj, Specs.class);
            stringRedisTemplate.expire(REDIS_PREX_DYNAMICPARAM_SPECS + markId,30,TimeUnit.MINUTES);
        }
//        List<Skus> skusList = loadSkusList(markId);


        String skusListSpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SKUS + markId);
        List<Skus> skusList = null;
        if (StrUtil.isNotBlank(skusListSpecsJsonObj)) {
            skusList = JSONUtil.toList(skusListSpecsJsonObj, Skus.class);
            stringRedisTemplate.expire(REDIS_PREX_DYNAMICPARAM_SKUS + markId,30,TimeUnit.MINUTES);
        }


        DynamicParamAll dynamicParamAll = new DynamicParamAll();
        dynamicParamAll.setSkusList(skusList);
        dynamicParamAll.setSpecsList(specsList);
        return ResponseResult.okResult(dynamicParamAll);
    }


    @ApiOperation("添加商品参数时数据-dstoolAddDynamicParamSpecs")
    @PostMapping("/dstoolAddDynamicParamSpecs")
    public ResponseResult dstoolAddDynamicParamSpecs(String markId,String name){
        String SpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SPECS + markId);
        List<Specs> specsList = new ArrayList<Specs>();
        if (StrUtil.isNotBlank(SpecsJsonObj)) {
            specsList = JSONUtil.toList(SpecsJsonObj, Specs.class);
            if(specsList.size()>1){
                return ResponseResult.errorResult(500,"为了用户体验，动态参数只能选择两个");
            }
        }
        Specs specs = new Specs();
        specs.setName(name);
        specs.setId(RandomUtil.randomInt(99999999));
        specsList.add(specs);
        JSONArray objects = JSONUtil.parseArray(specsList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SPECS + markId,objects.toString(),30,TimeUnit.MINUTES);
        loadAndSaveSkusList(markId);
        return ResponseResult.okResult("ok");
    }

    @ApiOperation("删除商品参数时数据-dstoolDelDynamicParamSpecs")
    @PostMapping("/dstoolDelDynamicParamSpecs")
    public ResponseResult dstoolDelDynamicParamSpecs(String markId,int id){
        String SpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SPECS + markId);
        List<Specs> specsList = new ArrayList<Specs>();
        if (StrUtil.isNotBlank(SpecsJsonObj)) {
            specsList = JSONUtil.toList(SpecsJsonObj, Specs.class);
        }
        if (specsList.isEmpty() || specsList ==null) {
            return ResponseResult.errorResult(500,"");
        }
        AtomicReference<Specs> specs = new AtomicReference<>(new Specs());
        specsList.forEach(item ->{
            if(item.getId() == id){
                System.out.println("!!!!!!!!!");
                specs.set(item);
            }
        });
        if(specs.get()!=null){
            specsList.remove(specs.get());
        }else {
            return ResponseResult.errorResult(500,"");
        }
        JSONArray objects = JSONUtil.parseArray(specsList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SPECS + markId,objects.toString(),30, TimeUnit.MINUTES);
        loadAndSaveSkusList(markId);
        return ResponseResult.okResult("ok");
    }


    @ApiOperation("添加商品参数时数据-addDynamicParamSpecsValue")
    @PostMapping("/dstoolAddDynamicParamSpecsValue")
    public ResponseResult dstoolAddDynamicParamSpecsValue(@RequestBody(required = true) SpecsValue specsValue){
        specsValue.setId(RandomUtil.randomInt(99999999));
        String markId = specsValue.getMarkId();
        String SpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SPECS + markId);
        int parentId = specsValue.getParentId();
        List<Specs> specsList = new ArrayList<Specs>();
        if (StrUtil.isNotBlank(SpecsJsonObj)) {
            specsList = JSONUtil.toList(SpecsJsonObj, Specs.class);
        }
        if (specsList.isEmpty() || specsList ==null) {
            return ResponseResult.errorResult(500,"");
        }
        specsList.forEach(item -> {
            if(item.id==parentId){
                List<SpecsValue> specsValueList = item.getValues();
                if(  specsValueList == null || specsValueList.isEmpty()){
                    specsValueList = new ArrayList<SpecsValue>();
                }
                specsValueList.add(specsValue);
                item.setValues(specsValueList);
            }
        });
        JSONArray objects = JSONUtil.parseArray(specsList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SPECS + markId,objects.toString(),30, TimeUnit.MINUTES);
        loadAndSaveSkusList(markId);
        return ResponseResult.okResult("ok");
    }


    @ApiOperation("修改临时数据-editSkusIsuse")
    @PostMapping("/editSkusIsuse")
    public ResponseResult editSkusIsuse(String markId,int id){
        String skusListSpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SKUS + markId);
        List<Skus> skusList = null;
        if (StrUtil.isNotBlank(skusListSpecsJsonObj)) {
            skusList = JSONUtil.toList(skusListSpecsJsonObj, Skus.class);
            stringRedisTemplate.expire(REDIS_PREX_DYNAMICPARAM_SKUS + markId,30,TimeUnit.MINUTES);
        }
        skusList.forEach(item -> {
            if(item.getId() == id){
                if(item.getIsUse() == 1){
                    item.setIsUse(0);
                }else {
                    item.setIsUse(1);
                }
            }
        });
        JSONArray objects = JSONUtil.parseArray(skusList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SKUS + markId,objects.toString(),30, TimeUnit.MINUTES);
        return ResponseResult.okResult("ok");
    }


    @ApiOperation("获取商品列表参数零时数据-getSkusById")
    @GetMapping("/getSkusById")
    public ResponseResult getSkusById(String markId,int id) {
        String skusListSpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SKUS + markId);
        List<Skus> skusList = null;
        if (StrUtil.isNotBlank(skusListSpecsJsonObj)) {
            skusList = JSONUtil.toList(skusListSpecsJsonObj, Skus.class);
            stringRedisTemplate.expire(REDIS_PREX_DYNAMICPARAM_SKUS + markId,30,TimeUnit.MINUTES);
        }
        AtomicReference<Skus> skus = new AtomicReference<>(new Skus());
        skusList.forEach(item -> {
            if(item.getId() == id){
                skus.set(item);
            }
        });
        Skus skus1 = skus.get();
        return ResponseResult.okResult(skus1);
    }

    @ApiOperation("获取商品列表参数零时数据-getSkusById")
    @PostMapping("/updateSkus")
    public ResponseResult updateSkus(@RequestBody(required = true) Skus skus) {
        String markId = skus.getMarkId();
        int id = skus.getId();
        String skusListSpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SKUS + markId);
        List<Skus> skusList = null;
        if (StrUtil.isNotBlank(skusListSpecsJsonObj)) {
            skusList = JSONUtil.toList(skusListSpecsJsonObj, Skus.class);
            stringRedisTemplate.expire(REDIS_PREX_DYNAMICPARAM_SKUS + markId,30,TimeUnit.MINUTES);
        }
        skusList.forEach(item -> {
            if(item.getId() == id){
                item.setPrice(skus.getPrice());
                item.setOldPrice(skus.getOldPrice());
                item.setInventory(skus.getInventory());
                item.setPicture(skus.getPicture());
            }
        });
        JSONArray objects = JSONUtil.parseArray(skusList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SKUS + markId,objects.toString(),30, TimeUnit.MINUTES);
        return ResponseResult.okResult("修改成功");
    }

    public void loadAndSaveSkusList(String markId){
        List<Skus> skusList = loadSkusList(markId);
        JSONArray objects = JSONUtil.parseArray(skusList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SKUS + markId,objects.toString(),30, TimeUnit.MINUTES);
    }

    public List<Skus> loadSkusList(String markId){
        String SpecsJsonObj = stringRedisTemplate.opsForValue().get(REDIS_PREX_DYNAMICPARAM_SPECS + markId);
        List<Specs> specsList = null;
        if (StrUtil.isNotBlank(SpecsJsonObj)) {
            specsList = JSONUtil.toList(SpecsJsonObj, Specs.class);
        }
        if (StrUtil.isBlank(SpecsJsonObj)) {
            return null;
        }

        List<Skus> skusList =new ArrayList<Skus>();
        if(specsList.size() == 1){
            if(specsList.get(0).getValues() != null){
                for (int i =0;i<specsList.get(0).getValues().size();i++) {
                    Skus skus = new Skus();
                    skus.setPrice(BigDecimal.valueOf(0));
                    skus.setOldPrice(BigDecimal.valueOf(0));
//                    skus.setPrice(0);
//                    skus.setOldPrice(0);
                    skus.setId(RandomUtil.randomInt(99999999));
                    skus.setInventory(0);
                    skus.setIsUse(1);
                    skus.setGoodsId(0L);
                    skus.setPicture(null);

                    SkusValue skusValue = new SkusValue();
                    skusValue.setName(specsList.get(0).getName());
                    skusValue.setValueName(specsList.get(0).getValues().get(i).getName());

                    List<SkusValue> list=new ArrayList<SkusValue>();
                    list.add(skusValue);
                    skus.setSpecs(list);
                    skusList.add(skus);
                }
            }
        }
        if(specsList.size() == 2){
            if(specsList.get(0).getValues()!=null && (specsList.get(1).getValues()!=null)){
                for (int i =0;i<specsList.get(0).getValues().size();i++) {
                    for (int j =0;j<specsList.get(1).getValues().size();j++) {
                        Skus skus = new Skus();
                                            skus.setPrice(BigDecimal.valueOf(0));
                    skus.setOldPrice(BigDecimal.valueOf(0));
//                        skus.setPrice(0);
//                        skus.setOldPrice(0);
                        skus.setId(RandomUtil.randomInt(99999999));
                        skus.setInventory(0);
                        skus.setIsUse(1);
                        skus.setGoodsId(0L);
                        skus.setPicture(null);

                        SkusValue skusValue1 = new SkusValue();
                        skusValue1.setName(specsList.get(0).getName());
                        skusValue1.setValueName(specsList.get(0).getValues().get(i).getName());

                        SkusValue skusValue2 = new SkusValue();
                        skusValue2.setName(specsList.get(1).getName());
                        skusValue2.setValueName(specsList.get(1).getValues().get(j).getName());

                        List<SkusValue> list=new ArrayList<SkusValue>();
                        list.add(skusValue1);
                        list.add(skusValue2);
                        skus.setSpecs(list);
                        skusList.add(skus);
                    }
                }
            }

            if(specsList.get(0).getValues() == null && (specsList.get(1).getValues()!=null)){
                for (int i =0;i<specsList.get(1).getValues().size();i++) {
                    Skus skus = new Skus();
                                        skus.setPrice(BigDecimal.valueOf(0));
                    skus.setOldPrice(BigDecimal.valueOf(0));
//                    skus.setPrice(0);
//                    skus.setOldPrice(0);
                    skus.setId(RandomUtil.randomInt(99999999));
                    skus.setInventory(0);
                    skus.setIsUse(1);
                    skus.setGoodsId(0L);
                    skus.setPicture(null);

                    SkusValue skusValue = new SkusValue();
                    skusValue.setName(specsList.get(0).getName());
                    skusValue.setValueName(specsList.get(0).getValues().get(i).getName());

                    List<SkusValue> list=new ArrayList<SkusValue>();
                    list.add(skusValue);
                    skus.setSpecs(list);
                    skusList.add(skus);
                }
            }

            if(specsList.get(0).getValues() != null && (specsList.get(1).getValues()==null)){
                for (int i =0;i<specsList.get(0).getValues().size();i++) {
                    Skus skus = new Skus();
                                        skus.setPrice(BigDecimal.valueOf(0));
                    skus.setOldPrice(BigDecimal.valueOf(0));
//                    skus.setPrice(0);
//                    skus.setOldPrice(0);
                    skus.setId(RandomUtil.randomInt(99999999));
                    skus.setInventory(0);
                    skus.setIsUse(1);
                    skus.setGoodsId(0L);
                    skus.setPicture(null);

                    SkusValue skusValue = new SkusValue();
                    skusValue.setName(specsList.get(0).getName());
                    skusValue.setValueName(specsList.get(0).getValues().get(i).getName());

                    List<SkusValue> list=new ArrayList<SkusValue>();
                    list.add(skusValue);
                    skus.setSpecs(list);
                    skusList.add(skus);
                }
            }

        }
//        JSONArray objects = JSONUtil.parseArray(skusList);
//        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SKUS + markId,objects.toString(),30, TimeUnit.MINUTES);
        JSONArray objects = JSONUtil.parseArray(skusList);
        stringRedisTemplate.opsForValue().set(REDIS_PREX_DYNAMICPARAM_SKUS + markId,objects.toString(),30, TimeUnit.MINUTES);
        return skusList;
    }

//    public static void main(String[] args) {
//        System.out.println(RandomUtil.randomInt(99999999));
//    }


}
